package com.cp.mtq.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定义一个代理类，这个代理必须要实现invocaHandler 接口，用以指定这个类为一个代理类
public class MyProxy implements InvocationHandler {
    private Object target;
    public MyProxy( Object target){
        this.target=target;
    }
    // 实现 invoke方法，这个方法将是后面代码中实际执行的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始执行动态代理");
        Object result=method.invoke(target,args);
        return  result;
    }
    // Proxy类为反射机制中的一个类，用于获得代理对象
    public <T> T getProxy(){
        /* newProxyInstance方法的参数解释：
         ** 被代理对象的类加载器：target.getClass().getClassLoader()
         ** 被代理的方法：target.getClass().getInterfaces()
         **代理对象：this
         */
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    public static void main(String[] args) {
        // 创建一个被代理对象
        Subject subject=new SubjectImpl();
        // 创建一个代理对象
        Subject proxy=new MyProxy(subject).getProxy();
        // 调用代理的方法
        System.out.println(proxy.test("test"));
    }

}
